package com.leyou.item.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.leyou.common.exception.pojo.ExceptionEnum;
import com.leyou.common.exception.pojo.LyException;
import com.leyou.common.pojo.PageResult;
import com.leyou.item.Mapper.BrandMapper;
import com.leyou.item.pojo.Brand;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 品牌Service
 */
@Service
@Transactional
public class BrandService extends ServiceImpl<BrandMapper, Brand> {
    @Autowired(required = false)
    private BrandMapper brandMapper;

    public PageResult<Brand> brandPageQuery(String key, Integer page, Integer rows, String sortBy, Boolean desc) {
        // 1.封装所有条件
        // 1.1 IPage: 用于封装分页参数的对象，例如:当前页码，每页大小，总页数，当前页数据列表等

        // 一：当前页码
        //二： 每页大小
        IPage iPage = new Page(page,rows);

        // 1.2 Wrapper: 用于封装查询条件（where），以及排序字段（order by）
        QueryWrapper<Brand> wrapper = Wrappers.query();

        if(StringUtils.isNotEmpty(key)){
            /**
             * wrapper.like(name,value)
             *  name: 表的字段名称，而不是属性名称
             *  value: 查询的内容
             */

            // sql: name like '%key%' or letter = 'key'
            wrapper.like("name",key)
                    .or()
                    .eq("letter",key.toUpperCase());
        }

        //排序
        if(StringUtils.isNotEmpty(sortBy)){
            if(desc){
                // 降序
                wrapper.orderByDesc(sortBy);
            }else{
                wrapper.orderByAsc(sortBy);
            }
        }

        // 2.执行查询，获取结果
        iPage = brandMapper.selectPage(iPage,wrapper);

        // 3.封装分页结果（PageResult对象）
        /**
         * iPage.getTotal():总记录数
         * iPage.getPages():总页数
         * iPage.getRecords():当前页数据列表
         */

        PageResult<Brand> pageResult = new PageResult(iPage.getTotal(),iPage.getPages(),iPage.getRecords());

        //返回分页结果
        return pageResult;
    }

    public void saveBrand(Brand brand, List<Long> cids) {

        try {
            //1. 保存品牌
            brandMapper.insert(brand); // 注意: Mybatis Plus在执行完insert后，会自动把表的主键赋值给对象的id属性.

            //2. 保存分类品牌中间表
            brandMapper.insertCategoryAndBrand(cids,brand.getId());
        } catch (Exception e) {
            e.printStackTrace();
            throw new LyException(ExceptionEnum.INSERT_OPERATION_FAIL);
        }
    }

    public Brand findBrandById(Long id) {

        Brand brand = brandMapper.selectById(id);
        if(brand == null){
            throw new LyException(ExceptionEnum.BRAND_NOT_FOUND);
        }

        return brand;
    }

    public List<Brand> findBrandsByCid(Long id) {
        List<Brand> brands = brandMapper.findBrandsByCid(id);
        if(CollectionUtils.isEmpty(brands)){
            throw new LyException(ExceptionEnum.BRAND_NOT_FOUND);
        }
        return brands;
    }

    public List<Brand> findBrandsByIds(List<Long> ids) {
        List<Brand> brands = brandMapper.selectBatchIds(ids);
        if(CollectionUtils.isEmpty(brands)){
            throw new LyException(ExceptionEnum.BRAND_NOT_FOUND);
        }
        return brands;
    }
}
